package managerOptymalizacji;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import optymalizacjaSkladowania.AnalitykSkladowania;
import optymalizacjaSkladowania.LosowyAnalitykSkladowania;
import optymalizacjaSkladowania.PierwszeWolneAnalitykSkladowania;
import optymalizacjaSkladowania.PropozycjaPrzydzialow;
import optymalizacjaSkladowania.WszystkieRazemAnalitykSkladowania;
import skladowisko.Terminal;
import skladowisko.transport.TransportPrzychodzacy;
import skladowisko.utils.ITerminalCreator;
import skladowisko.utils.ITerminalCreatorFactory;
import skladowisko.utils.ITransportCreator;
import skladowisko.utils.TransportPCreator;
import skladowisko.utils.XStreamTerminalCreator;
import skladowisko.utils.XStreamTerminalSaver;

/**
 *
 * @author Krzysiek
 */
public class ManagerOptymalizacjiSkladowania
{

    private List<AnalitykSkladowania> analitycy;
    private IFunkcjaOcenyPrzydzialu funkcjaOceny = new FunkcjaOcenyStandard();
    private WynikAnalizy wynik;

    public ManagerOptymalizacjiSkladowania()
    {
        inicjujAnalitykow();
    }

    private void analizujWszystkichAnalitykow(Terminal t, TransportPrzychodzacy transport)
    {
        XStreamTerminalCreator creator = new XStreamTerminalCreator();
        XStreamTerminalSaver saver = new XStreamTerminalSaver();


        String sciezka = "tmp_terminal.xml";
        String sciezkaTransport = "tmp_transport.xml";
        saver.zapisz(t, sciezka);
        saver.zapiszTransport(transport, sciezkaTransport);


        for (AnalitykSkladowania analityk : analitycy)
        {
            analityk.clear();
            t = creator.wczytajTerminal(sciezka);
            transport = (TransportPrzychodzacy) creator.wczytajTransport(sciezkaTransport);

            t.dodajTransportPrzychodzacy(transport);
            PropozycjaPrzydzialow propozycja = analityk.przydzielajMiejsca(t, transport);
            double ocena = funkcjaOceny.oceniajPrzydzial(t, propozycja);
            String opis = wynik.dodajWynik(ocena, analityk.getClass().getName(), transport.getNazwa(), t.getNazwa() + "");

            System.out.println(opis);
        }
    }

    private void analizujWszystkieTransporty(Terminal terminal, File dirTransporty)
    {
        File[] transporty = dirTransporty.listFiles();

        for (int r = 0; r < transporty.length; r++)
        {
            try
            {
                ITransportCreator kreator = new TransportPCreator();
                TransportPrzychodzacy transport = (TransportPrzychodzacy) kreator.wczytajTransport(transporty[r].getAbsolutePath());
                transport.setNazwa(transporty[r].getName());
                analizujWszystkichAnalitykow(terminal, transport);
            } catch (Exception ex)
            {
                System.out.println("Problemy podczas wczytywania transportu..." + ex.getMessage());
            }
        }
    }

    public WynikAnalizy analizujWszystkieKombinacje(File dirTerminale, File dirTransporty)
    {
        wynik = new WynikAnalizy();

        File[] terminale = dirTerminale.listFiles();
        for (int i = 0; i < terminale.length; i++)
        {
            ITerminalCreator kreator = ITerminalCreatorFactory.createrITerminalCreator(terminale[i].getAbsolutePath());
            Terminal t = kreator.wczytajTerminal(terminale[i].getAbsolutePath());
            t.setNazwa(terminale[i].getName());
            analizujWszystkieTransporty(t, dirTransporty);
        }

        return wynik;
    }

    private void inicjujAnalitykow()
    {
        analitycy = new ArrayList<AnalitykSkladowania>();        
        analitycy.add(new LosowyAnalitykSkladowania());
        analitycy.add(new PierwszeWolneAnalitykSkladowania());
        analitycy.add(new WszystkieRazemAnalitykSkladowania());
        //analitycy.add(new MojAnalitykSkladowania());
        //TODO dodanie pozostalych analitykow...
    }
}
